//
//  HMUserAccountViewModel.swift
//  新浪微博
//
//  Created by 饶鹏伟 on 16/4/10.
//  Copyright © 2016年 饶鹏伟. All rights reserved.
//

//用户信息保存到沙盒中 创建的字典的键
private let userInfoKey = "com.itheima.userifonKey"

import UIKit


//非常多的界面都会找viewmodel获取数据 不在直接找model
//viewModel 处理业务逻辑 ,网络请求,数据缓存
class HMUserAccountViewModel: NSObject {
    
    //创建单例对象
    static let sharedAccountViewModel: HMUserAccountViewModel=HMUserAccountViewModel()

    //定义一个模型对象 好处：在程序运行的时候一次性把沙盒的数据导入模型 下次用到数据的时候不会再进入到沙盒 直接去模型取值就行 如果没有模型 每次用到一个数据都会进入到沙盒 避免多次进入沙盒 减少内存的消耗问题 
    var userAccount: HMUserAccount?

    //添加一个计算性属性(只读属性)
    var userLogin: Bool {
        //1.UserAccount的token 如果不为空 && 用户token不过期 用户已经登录
        //  没有过期  过期日期大于当前日期 降序OrderedDescending
        if let u = userAccount where u.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            
            return true
        }
        //将userAccount 设置为 nil
        userAccount = nil
        return false
    }
    
    //私有化构造函数  让其成为单例对象
    private override init() {
        super.init()
        userAccount = self.loadUserInfo()
    }
    
    
    //增加一个用户头像NSURL类型的属性 放在这里提供一个url 方便其他地方用到这个头像 直接过来取就行
    var headImageURL: NSURL? {
        let url = NSURL(string: userAccount?.avatar_large ?? "")
        return url
    }

    
    
    // 使用授权码 请求accesstoken 网络请求的方法
    
    func loadAccessToken(code: String, finished:(isSuccess: Bool) -> ()){
        
        // 获取授权的url 获取授权过的Access Token
        //let urlString="https://api.weibo.com/oauth2/access_token"
        //  拼接参数 AFN中参数 以字典的形式传递
        //let parameters=["client_id":client_id, "client_secret":client_secret, "grant_type":"authorization_code", "code":code, "redirect_uri":redirect_uri]
        
//        //发送网络请求
//        HMNetworkTools.shardTools.request(.POST, urlString: urlString, parameters: parameters) { (result, error) -> () in
//            
//            if error != nil{
//                
//                print(error)
//                
//                finished(isSuccess: false)
//                
//                return
//            }
//            
//            
//            print("授权成功")
//            //获取用户信息 在请求成功的回调中 再去获取用户信息
//            //用获取到的Access Token 获取用户信息
//            self.loadUserInfo(result!, finished: finished)
//            
//            
//        }
        
        
        HMNetworkTools.shardTools.loadAccessToken(code) { (result, error) -> () in
            
            if error != nil{
                
                finished(isSuccess: false)
                
                return
                
            }
            
            self.loadUserInfo(result!, finished: finished)
        }
    
    }
    
    private func loadUserInfo(tokenResult: AnyObject,finished: (isSuccess: Bool) -> ()){
        
        //将获取到的Access Token转化成字典
        guard let dict=tokenResult as? [String : AnyObject] else{
            
            finished(isSuccess: false)
            
            return
  }
        
        //获取字典中的   token ,uid
        let token = dict["access_token"]!
        let uid = dict["uid"]!
        
//        //利用获取的Access Token 去请求用户数据
//        //请求url 获取用户信息接口
//        let urlString = "https://api.weibo.com/2/users/show.json"
//        //拼接参数
//        let parameters=["access_token": token, "uid": uid]
//        
//        //发送网络请求
//        HMNetworkTools.shardTools.request(.GET, urlString: urlString, parameters: parameters) { (result, error) -> () in
//            
//            if error != nil{
//                
//                print(error)
//                
//                finished(isSuccess: false)
//                
//                return
//            }
//            
        
        HMNetworkTools.shardTools.loadUserInfo(token, uid: uid) { (result, error) -> () in
            
            if error != nil{
                
                
                finished(isSuccess: false)
                
                return
            }
            
            print("获取用户信息成功")
            
            //将获取的用户信息转化为字典
            guard var userInfoDict = result as? [String : AnyObject] else {
                finished(isSuccess: false)
                return
            }
            
            //合并 Access Token和用户信息 方便后面保存用户数据 因为需要保存的数据在两个获取的资源里面都有需要保存的
            // 合并字典 遍历第一个字典 添加到第二个字典
            
            for (k,v) in dict{
                
                userInfoDict[k]=v
            }
            
            //print(userInfoDict)
            //将用户信息保存起来 保存到沙盒
            self.saveUserAccount(userInfoDict)
            
            //执行成功的回调
            finished(isSuccess: true)
            
        }

    }
        
}
    

//  添加类扩展 存储数据 , 获取数据

extension HMUserAccountViewModel{
    
    func saveUserAccount(userInfoDict: [String : AnyObject]){
        
       //保存完整的字典信息  偏好设置中不能保存nil
       let userDefaults=NSUserDefaults.standardUserDefaults()
         //1.将字典信息转换为模型对象
       let account=HMUserAccount(dict: userInfoDict)
        
        //给单例对象的用户账户模型属性赋值,为了解决从未登录状态到登录状态用户账户模型为空的问题 完成跳转到欢迎界面，解决显示界面上的控件有值得问题 第一次登陆account没有值 所以提前赋值
        self.userAccount = account
        
        //2.获取模型对象字典信息 将模型转化为字典保存到沙盒中
        let keys = ["access_token","avatar_large","name","expires_in","uid"]
        let accountDict = account.dictionaryWithValuesForKeys(keys)

        //3.将对象的字典信息保存到偏好设置中
        userDefaults.setObject(accountDict, forKey: userInfoKey)
        //4.同步
        userDefaults.synchronize()
        
        print(NSHomeDirectory())
}
    
    //获取沙盒中存储的数据
    func loadUserInfo() -> HMUserAccount?{
        
        //1.获取字典信息
        guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInfoKey) as? [String : AnyObject] else {
            return nil
        }
        //2.将字典转换为模型
        let account = HMUserAccount(dict: dict)
        return account
        
    }
}

